import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import com.github.houbb.opencc4j.util.ZhConverterUtil;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChangeHelper {

    /**
     * 递归获取目录下所有路径 包括文件夹及文件
     */
    private static List<File> getAllPaths(File root) {
        File[] files = root.listFiles();
        if (files != null) {
            List<File> paths = new ArrayList<>(Arrays.asList(files));
            for (File file : files) {
                paths.addAll(getAllPaths(file));
            }
            return paths;
        } else {
            return new ArrayList<>();
        }
    }

    /**
     * 主方法
     *
     * @param basePath 根路径
     */
    public static void changeFilesToSimple(String basePath, int maxThreads) {
        // 获取根路径
        File root = new File(basePath);
        // 获取所有路径
        List<File> paths = getAllPaths(root);
        // 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(maxThreads);
        // 声明计数器
        CountHelper countHelper = new CountHelper(paths.size());
        // 递归获取根路径下所有的路径
        for (File file : paths) {
            pool.submit(() -> {
                createSimpleFile(basePath, file);
                countHelper.add();
                countHelper.print();
            });
        }
        // 执行完成后关闭线程池
        pool.shutdown();
    }

    /**
     * 转换单个文件方法
     *
     * @param basePath 根路径
     * @param file     文件
     */
    private static void createSimpleFile(String basePath, File file) {
        if (file.isFile() && file.getName().endsWith(".txt")) {
            // 如果是文件路径
            try {
                // 读取文件内容
                String str = FileUtil.readString(file, Charset.forName("gbk"));
                // 获取文件转换后的路径
                String newPath = StrUtil.replace(file.getAbsolutePath(), basePath, basePath + "_simple");
                // 路径转简体
                newPath = ZhConverterUtil.convertToSimple(newPath);
                // 创建上级文件夹
                FileUtil.mkParentDirs(newPath);
                // 构建输出流
                FileOutputStream out = new FileOutputStream(newPath);
                // 转换简体内容并写入文件
                IoUtil.write(out, true, ZhConverterUtil.convertToSimple(str).getBytes("gbk"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
